package cn.wolfcode.luowowo.redis.service.impl;

import cn.wolfcode.luowowo.domain.Strategy;
import cn.wolfcode.luowowo.redis.service.IStrategyStatisVORedisService;
import cn.wolfcode.luowowo.redis.util.RedisKeys;
import cn.wolfcode.luowowo.service.IStrategyService;
import cn.wolfcode.luowowo.util.DateUtil;
import cn.wolfcode.luowowo.vo.StrategyStatisVO;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

//攻略统计数据服务业务实现
@Service
public class StrategyStatisVORedisServiceImpl implements IStrategyStatisVORedisService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private IStrategyService strategyService;

    //让指定id攻略阅读数+1
    @Override
    public void incrementViewnum(String sid) {
        //获取vo
        StrategyStatisVO vo = this.get(sid);
        //阅读数+1
        vo.setViewnum(vo.getViewnum()+1);
        //更新
        this.set(vo);

    }
    //根据攻略id获取统计数据vo对象
    @Override
    public StrategyStatisVO get(String sid) {
        //创建vo对象用于接收结果
        StrategyStatisVO vo = new StrategyStatisVO();
        //用攻略id组合key
        String key = RedisKeys.STRATEGY_STATIS_VO.join(sid);
        //查询key是否存在
        if (redisTemplate.hasKey(key)){
            //存在则获取vo对象也就是value
            String voJson = redisTemplate.opsForValue().get(key);
            //json格式的vo对象转换为java    第二个参数指定转换类型
            vo = JSON.parseObject(voJson, StrategyStatisVO.class);
        }else {
            //不存在则，用创建好的空vo对象初始化数据
            //查询攻略获取统计数据
            Strategy strategy = strategyService.get(sid);
            //设置到vo中
            BeanUtils.copyProperties(strategy , vo);
            vo.setStrategyId(strategy.getId());
        }
        //返回vo
        return vo;
    }

    //更新vo
    @Override
    public void set(StrategyStatisVO vo) {
        //拼接指定攻略下的key,vo转换成json并更新
        redisTemplate.opsForValue().set(RedisKeys.STRATEGY_STATIS_VO.join(vo.getStrategyId()) , JSON.toJSONString(vo));
    }
    //攻略收藏  true为收藏成功,false为取消收藏
    @Override
    public boolean favor(String sid, String uid) {
        List<String> favors = this.getFavors(uid);

        //准备vo对象接收统计数据集合
        StrategyStatisVO vo = new StrategyStatisVO();
        //判断点击收藏的攻略id在不在这个集合中
        if (favors.contains(sid)){
            //有则是取消收藏移出集合
            favors.remove(sid);
            //收藏数-1
            vo = this.get(sid);
            vo.setFavornum(vo.getFavornum() - 1 );
        }else {
            //没则是收藏,添进集合,收藏+1
            favors.add(sid);
            vo = this.get(sid);
            vo.setFavornum(vo.getFavornum() + 1 );
        }
        //更新收藏数
        this.set(vo);
        //更新用户收藏
        redisTemplate.opsForValue().set(RedisKeys.USER_STRATEGY_FAVORNUM.join(uid) ,JSON.toJSONString(favors));
        //返回结果
        return favors.contains(sid);
    }
    //通过用户id获取用户攻略收藏集合
    @Override
    public List<String> getFavors(String uid) {
        //准备空的集合存收藏集合
        List<String> favors = new ArrayList();
        //获取用户id，组成key查询有没有这个缓存
        String key = RedisKeys.USER_STRATEGY_FAVORNUM.join(uid);
        if (redisTemplate.hasKey(key)){
            //有则获取攻略id集合
            String listJson = redisTemplate.opsForValue().get(key);
            //转换为java集合     第二个参数指定集合元素类型
            favors = JSON.parseArray(listJson, String.class);

        }else {
            //没有则创建并初始化 没做收藏表暂时跳过查询

        }
        return favors;
    }
    //用户攻略点赞    顶过是true   没顶返回是false
    @Override
    public boolean strategyThumbup(String sid, String uid) {
        //组成key查询有没有这个缓存
        String key = RedisKeys.USER_STRATEGY_THUMBSUPNUM.join(sid, uid);
        if (redisTemplate.hasKey(key)){
            //存在则是顶过
            return true;
        }else {
            //不存在则今天没顶
            Long time = null;
            //获取当前时间
            Date now = new Date();
            //获取今天最晚的时间
            Date end = DateUtil.getEndDate(now);
            //创建,并设置过期时间为到今天结束,单位秒
            redisTemplate.opsForValue().set(key , "1" , DateUtil.getDateBetween(now , end) , TimeUnit.SECONDS);
            //点赞数+1
            StrategyStatisVO vo = this.get(sid);
            vo.setThumbsupnum(vo.getThumbsupnum() + 1);
            //更新收藏数
            this.set(vo);
            return false;
        }

    }
    //判断当前统计对象是否已经存在缓
    @Override
    public boolean hasStrategyStatisVO(String sid) {
        return redisTemplate.hasKey(RedisKeys.STRATEGY_STATIS_VO.join(sid));
    }
    //攻略评论数+1
    @Override
    public void incrementReplynum(String sid) {
        //获取vo
        StrategyStatisVO vo = this.get(sid);
        //评论数+1
        vo.setReplynum(vo.getReplynum() + 1);
        //更新
        this.set(vo);
    }
}
